package com.wangzhenyu.learn.test.designPattern

//单例模式

@Suppress("UNUSED")
object CreateSingletonClass {

    //饿汉式
    object Singleton01


}

//饱汉式
@Suppress("UNUSED")
abstract class BaseSingleton<in P, out T> {
    @Volatile
    private var instance: T? = null

    protected abstract val creator: (P) -> T

    fun getInstance(parameter: P): T =
        instance ?: synchronized(this) {
            //creator(parameter).also { instance = it }该处可能发生重排序，
            //正常顺序为①分配内存空间②调用构造器，初始化实例③返回地址给引用
            //重排序后为①分配内存空间②返回地址给引用（此时instance已经不为null了,但对象还未初始化）③调用构造器，初始化实例
            //加上volatile避免重排序，不然可能会拿到未初始化的实例。同时保证线程的可见性
            instance ?: creator(parameter).also { instance = it }
        }

}